perm filename TYPE31.SAI[CAR,BGB] blob sn#019088 filedate 1973-01-07 generic text, type T, neo UTF8
00100	ENTRY DOTDD,SHOWDD,CLRDD,ERASDD,STRDD,AIDD,AVDD;
00200	BEGIN	"TYPE31"
00300		REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
00400		INTERNAL SAFE INTEGER ARRAY DDBUF[1:480*18+2];
00500		INTEGER DDPTR,DDBIT;
00600	INTERNAL PROCEDURE CLRDD (INTEGER CHAN);
00700	BEGIN	"CLRDD"
00800		INTEGER LINE,LINEWD,COLCHN;
00900	α RESET GRAPHICS COMMAND WORDS TO ALL ZEROES;
01000		DDBUF[1]	←	2;
01100		ARRBLT(DDBUF[2],DDBUF[1],480*18);
01200	α RESET COLUMN,COLUMN,CHANNEL WORDS TO 1,1,0;
01300		COLCHN	←	'002004003324;
01400		DPB(CHAN,POINT(8,COLCHN,23));
01500		FOR DDPTR←2 STEP 18 UNTIL 2+18*479 DO
01600		DDBUF[DDPTR]	←	COLCHN;
01700	α RESET EXECUTE, LINE SELECT COMMAND WORDS;
01800		FOR LINE←0 STEP 1 UNTIL 479 DO
01900	BEGIN	"ROWS"
02000		LINEWD	←	'0454;
02100		DPB(LINE   ,POINT(4,LINEWD,23));
02200		DPB(LINE%16,POINT(5,LINEWD,15));
02300		DDPTR	←	((LINE LAND 3)*120 + LINE%4)*18 + 1;
02400		DDBUF[DDPTR]←	LINEWD;
02500	END	"ROWS";
02600	α RESET THE FIRST AND THE LAST TWO COMMAND WORDS;
02700		DDPTR	←	480*18;
02800		DDBUF[1]←	DDBUF[1] LOR '156000001454;
02900		DDBUF[DDPTR+1]←	'000004010334;
03000		DDBUF[DDPTR+2]←	0;
03100	END	"CLRDD";
     

00100	INTERNAL PROCEDURE DOTDD (INTEGER X,Y);
00200	BEGIN	"DOTDD"
00300		X	←	(0 MAX X) MIN 511;
00400		Y	←	(0 MAX Y) MIN 479;
00500		DDPTR	←	((Y LAND 3)*120 + (Y%4))*18 + (X%32) + 3;
00600		DDBIT	←	X LAND '37;
00700		DPB(1,POINT(1,DDBUF[DDPTR],DDBIT));
00800	END	"DOTDD";
00900	INTERNAL PROCEDURE SHOWDD;
01000	QUICK_CODE "SHOWDD"
01100		INTEGER T1,T2;
01200		MOVEI	11,8642;
01300		MOVEM	11,T2;
01400		MOVE	11,DDBUF;
01500		HRRZM	11,T1;
01600		'715000000000 3,T1;
01700	END	"SHOWDD";
     

00100	INTERNAL PROCEDURE LINEDD (INTEGER X1,Y1,X2,Y2);
00200	BEGIN	"LINEDD"
00300		REAL DX,DY,X,Y;
00400		INTEGER I,N;
00500		DX	←	X2-X1;
00600		DY	←	Y2-Y1;
00700		N	←	ABS(DX) MAX ABS(DY);
00800		DX	←	DX/N;
00900		DY	←	DY/N;
01000		DOTDD(X←X1,Y←Y1);
01100		FOR I←2 STEP 1 UNTIL N DO
01200		DOTDD(X←X+DX,Y←Y+DY);
01300		DOTDD(X2,Y2);
01400	END	"LINEDD";
01500		INTEGER BEAMX,BEAMY;
01600	INTERNAL PROCEDURE AIDD (INTEGER X,Y);
01700	BEGIN	"AIDD"
01800		BEAMX	←	X;
01900		BEAMY	←	Y;
02000	END	"AIDD";
02100	
02200	INTERNAL PROCEDURE AVDD (INTEGER X,Y);
02300	BEGIN	"AVDD"
02400		LINEDD(BEAMX,BEAMY,X,Y);
02500		BEAMX	←	X;
02600		BEAMY	←	Y;
02700	END	"AVDD";
     

00100	α ERASE THE DATA DISC'S SCREEN;
00500	INTERNAL PROCEDURE ERASDD (INTEGER CHAN);
00600	BEGIN
00700	INTEGER COLCHN,X1,X2,X3;
00800		COLCHN ← '136004301324;
00900		DPB(CHAN,POINT(8,COLCHN,23));
01000		X1←0;
01100	START_CODE "ERASDD"
01200		INTEGER T1,T2;
01300		LABEL L;
01400		MOVEI	11,COLCHN;
01500		MOVEM	11,T1;
01600		MOVEI	11,2;
01700		MOVEM	11,T2;
01800	L:	'715000000000 3,T1;
01900	END	"ERASDD";
02000	END;
     

00100	α DISPLAY A STRING ON CHANNEL 36;
00200	INTERNAL PROCEDURE STRDD (INTEGER X,Y; STRING STR);
00300	BEGIN	"STRDD"
00400		INTEGER SIZ,I;
00500		SIZ	←	LENGTH(STR);
00600		IF SIZ=0 THEN RETURN;
00700		SIZ	←	(IF SIZ MOD 5 THEN 1 ELSE 0) + SIZ%5;
00800	BEGIN	"DDBLK"
00900		INTEGER ARRAY DDBUF[-1:SIZ+2+10];
01000		INTEGER FNLINE,COLCHN;
01100	α ASSEMBLE THE FUNCTION AND LINE SELECT WORD;
01200		FNLINE	←	'1454;
01300		DPB('66,   POINT(6,FNLINE, 7));
01400		DPB(Y%16,  POINT(5,FNLINE,15));
01500		DPB(Y,     POINT(4,FNLINE,23));
01600		DDBUF[-1]←	FNLINE;
01700	α ASSEMBLE THE COLUMN AND CHANNEL SELECT WORD;
01800		COLCHN	←	'3324;
01900		DPB(1,     POINT(8,COLCHN, 7));
02000		DPB(X DIV 6,  POINT(8,COLCHN,15));
02100		DPB('35, POINT(8,COLCHN,23));
02200		DDBUF[0]←	COLCHN;
02300	α PACK THE STRING INTO TEXT COMMAND WORDS;
02400		FOR I←1 STEP 1 UNTIL SIZ-1 DO
02500	BEGIN	"PACK"
02600		DDBUF[I]←	CVASC(STR) LOR 1;
02700		STR	←	STR[6 TOO ∞];
02800	END	"PACK";
02900		DDBUF[SIZ]←	CVASC(STR) LOR 1;
03000		DDBUF[SIZ+1]←	'000004010034;
03100		DDBUF[SIZ+2]←	0;
03200	α DISPLAY DD BUFFER;
03300	QUICK_CODE
03400		INTEGER T1,T2;
03500		MOVE	11,SIZ;
03600		ADDI	11,4;
03700		MOVEM	11,T2;
03800		MOVE	11,DDBUF;
03900		HRRZM	11,T1;
04000		'715000000000 3,T1;
04100		HRRZ	11,@DDBUF;
04200		TRC	11,'010000;
04300		HRRM	11,@DDBUF;
04400		'715000000000 3,T1;
04500	END;
04600	END	"DDBLK";
04700	END	"STRDD";
04800	END	"TYPE31";